package com.ingenio.dao;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ingenio.Adapter;
import com.ingenio.business.Almacen;
import com.ingenio.business.ControlCalidad;
import com.ingenio.business.DetalleMovimiento;
import com.ingenio.business.Movimiento;
import com.ingenio.business.Pedido;
import com.ingenio.business.Producto;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

public class ControlCalidadAdapter extends Adapter {
	
	public boolean agregarPedidoControlDeCalidad( List<DetalleMovimiento> detallesMov, Integer idMovimiento, Connection conn) throws Exception{
		try{
			String add_detalle = "INSERT INTO controlcalidad(IdMovimiento, IdProducto, IdEstadoCalidad, cantidadAprobada) " +
					"VALUES (?, ?, 3, 0)"; //El 3 es el estado pendiente de revision, El 0 es la cantidad aprobada inicial.
			PreparedStatement stmtInsert = (PreparedStatement) conn.prepareStatement(add_detalle);
			for (DetalleMovimiento detalleMovimiento : detallesMov){
					stmtInsert.setInt(1, idMovimiento);
					stmtInsert.setString(2, detalleMovimiento.getProducto().getIdProducto());
					stmtInsert.addBatch();
			}
			stmtInsert.executeBatch();
		}catch(Exception e){
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	public List<DetalleMovimiento> devolverPedidosPendienteControl(Pedido pedido) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
		List<DetalleMovimiento> listaDM = new ArrayList<DetalleMovimiento>();
		ProductoAdapter pa = new ProductoAdapter();
		Producto p = null;
		MovimientoAdapter ma = new MovimientoAdapter();
		Movimiento m = null;
		DetalleMovimiento dm = null;
		String sel = "";
		try{
			if(pedido == null){
				sel = "select * from controlcalidad c "+
						 "inner join detallemovimiento dm on c.IdMovimiento = dm.IdMovimiento and c.IdProducto = dm.IdProducto "+
						 "where c.IdEstadoCalidad = 3 ";
			}else{
				sel = "select * from controlcalidad c "+
						"inner join detallemovimiento dm on c.IdMovimiento = dm.IdMovimiento and c.IdProducto = dm.IdProducto "+
						"inner join movimiento m on dm.IdMovimiento = m.IdMovimiento "+
						"inner join pedido p on m.IdPedido = p.IdPedido "+
						"where c.IdEstadoCalidad = 3 and p.IdPedido = ? ";
			}
			conn = (Connection) abrirConexion();
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		if(pedido != null){
    			stmt.setInt(1, pedido.getIdPedido());
    		}
    		ResultSet result = stmt.executeQuery();
    		while(result.next()){
    			String idProducto = result.getString("IdProducto");
    			p = pa.devolverProducto(idProducto);
    			Integer idMovimiento = result.getInt("IdMovimiento");
    			m = ma.devolverMovimiento(idMovimiento);
    			Double cantidad = result.getDouble("cantidadMovimiento");
    			dm = new DetalleMovimiento(m, p, null, cantidad);
    			listaDM.add(dm);
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
		return listaDM;
	}

	public boolean actualizarControlCalidad(List<ControlCalidad> listaControlQ, Movimiento movActInv, Almacen a){
		Connection conn = null;
		MovimientoAdapter ma = new MovimientoAdapter();
		try{
			conn = (Connection) abrirConexion();
			conn.setAutoCommit(false);
			String sel = "UPDATE controlcalidad SET IdEstadoCalidad = ?, motivoRechazo = ?, cantidadAprobada = ? WHERE IdMovimiento=? AND IdProducto=? ";
			PreparedStatement stmt = (PreparedStatement) conn.prepareStatement(sel);
			for (ControlCalidad cc: listaControlQ){
					stmt.setInt(1, cc.getEstadoCalidad().getIdEstadoControlCalidad());
					stmt.setString(2, cc.getMotivoRechazo());
					stmt.setDouble(3, cc.getCantidadAprobada());
					stmt.setInt(4, cc.getDetMovimiento().getMovimiento().getIdMovimiento());
					stmt.setString(5, cc.getDetMovimiento().getProducto().getIdProducto());
					stmt.addBatch();
			}
			stmt.executeBatch();
			
			boolean execute = ma.agregarMovimiento(movActInv, a, conn);
			if(execute){
				conn.commit();
			}else{
				conn.rollback();
			}
		}catch(Exception e){
			e.printStackTrace();
			return false;
		}
		finally{
    		cerrarConexion(conn);
    	}
		return true;
	}

}
